home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / asm / fastsincos.lha / fastsincos / fastasin.asm < prev    next >
Assembly Source File  |  2000-04-12  |  2KB  |  151 lines

  1.     incdir    asm:
  2.     include    exec/execbase.i
  3.     include    math.i
  4.     include    phxmacros.i
  5.  
  6.     mc68040
  7.  
  8.     xref    _SysBase
  9.     xref    _exit
  10.  
  11.     EXTERN_LIB    AllocVec
  12.     EXTERN_LIB    FreeVec
  13.  
  14. dasin
  15.     fcmp.d    #1,fp0
  16.     fbne    .cont
  17.     fmove.d    #1e5,fp0
  18.     rts
  19.  
  20. .cont
  21.     fmove.d    #1,fp1
  22.     fmul.x    fp0,fp0
  23.     fsub.x    fp0,fp1
  24.     fsqrt.x    fp1
  25.     fmove.d    #1,fp0
  26.     fdiv.x    fp1,fp0
  27.     rts
  28.  
  29.     xdef    _INIT_1_FastASin
  30. _INIT_1_FastASin
  31.     move.l    _SysBase,a6
  32.     move.w    AttnFlags(a6),d0
  33.     btst    #AFB_68040,d0
  34.     beq    .ret
  35.     move.l    #24*9999,d0
  36.     moveq    #0,d1
  37.     callsys    AllocVec
  38.     move.l    d0,asintab
  39.     beq    .exit
  40.     move.l    d0,a0
  41.  
  42.     moveq    #0,d0
  43.     moveq    #1,d1
  44.  
  45. .loop
  46.     fmove.w    d0,fp2
  47.     fmul.d    #1e-4,fp2
  48.     fmove.w    d1,fp3
  49.     fmul.d    #1e-4,fp3
  50.     fmove.x    fp2,fp4
  51.     fasin.x    fp4 ;y
  52.  
  53. ;p->a=(dasin(x1)-dasin(x))*20000;
  54.     fmove.x    fp3,fp0
  55.     bsr    dasin
  56.     fmove.x    fp0,fp5
  57.     fmove.x    fp2,fp0
  58.     bsr    dasin
  59.     fsub.x    fp0,fp5
  60.     fmul.d    #20000,fp5
  61.     fmove.d    fp5,(a0)+
  62.  
  63. ;p->b=(asin(x1)-y)*10000-p->a*(2*x+1e-4);
  64.     fasin.x    fp3
  65.     fsub.x    fp4,fp3
  66.     fmul.d    #10000,fp3
  67.     fmove.x    fp2,fp0
  68.     fadd.x    fp0,fp0
  69.     fadd.d    #1e-4,fp0
  70.     fmul.x    fp5,fp0
  71.     fsub.x    fp0,fp3
  72.     fmove.d    fp3,(a0)+
  73.  
  74. ;p->c=y-(p->a*x+p->b)*x;
  75.     fmul.x    fp2,fp5
  76.     fadd.x    fp3,fp5
  77.     fmul.x    fp2,fp5
  78.     fsub.x    fp5,fp4
  79.     fmove.d    fp4,(a0)+
  80.     inc.w    d1
  81.     inc.w    d0
  82.     cmp.w    #9999,d0
  83.     blo    .loop
  84.  
  85. .ret
  86.     rts
  87.  
  88. .exit
  89.     pea    20
  90.     jsr    _exit
  91.  
  92.     xdef    _EXIT_1_FastASin
  93. _EXIT_1_FastASin
  94.     move.l    asintab,a1
  95.     callsys    FreeVec,SysBase
  96.     rts
  97.  
  98. asintab
  99.     dc.l    0
  100.  
  101.     xdef    fastasin___r_d
  102.     xdef    _fastasin__r
  103. fastasin___r_d
  104. _fastasin__r
  105.     pushm.l    d0/a0
  106.     fmove.d    12(sp),fp0
  107.     bsr    fastasin
  108.     popm.l    d0/a0
  109.     rts
  110.  
  111.     xdef    fastasin
  112. fastasin
  113.     fpush.x    fp1
  114.     fpush.x    fp0
  115.     fabs.x    fp0
  116.     fcmp.d    #1,fp0
  117.     fble    .cont
  118.     fmove.d    #PI2,fp0
  119.     bra    .contx
  120.  
  121. .cont
  122.     fmove.x    fp0,fp1
  123.     fmul.d    #10000,fp0
  124.     fintrz.x    fp0    ;This one is required. Dont skip it !
  125.     fmove.w    fp0,d0
  126.     cmp.w    #9999,d0
  127.     blo    .cont1    ;Avoid infinty
  128.     fpop.x    fp0
  129.     fasin.x    fp0
  130.     fpop.x    fp1
  131.     rts
  132.  
  133. .cont1
  134.     mulu.w    #24,d0
  135.     move.l    asintab,a0
  136.     add.l    d0,a0
  137.     fmove.d    (a0)+,fp0
  138.     fmul.x    fp1,fp0
  139.     fadd.d    (a0)+,fp0
  140.     fmul.x    fp1,fp0        
  141.     fadd.d    (a0),fp0
  142.  
  143. .contx
  144.     fpop.x    fp1
  145.     fbge    .cont2
  146.     fneg.x    fp0
  147.  
  148. .cont2
  149.     fpop.x    fp1
  150.     rts
  151.